## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Introduction des données

Le jeu de données qui sera étudié dans ce projet décrit le relevé de satisfaction de passagers en avion. Il contient les notes attribuées (entre 0 et 5) pour différents services ainsi que les catégories et profil des voyageur. Tout ceci dans le but de prédir leur satisfaction.

On voit que les deux premières colonnes (X & id) sont inutiles pour nos analyses, on va donc les supprimer.

DF <- read.csv("data/train.csv")
# On supprime les lignes ou il y a des valeurs manquantes.
DF <- DF[!rowMeans(is.na(DF)*1) > 0,]
str(DF)
## 'data.frame':    103594 obs. of  25 variables:
##  $ X                                : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ id                               : int  70172 5047 110028 24026 119299 111157 82113 96462 79485 65725 ...
##  $ Gender                           : chr  "Male" "Male" "Female" "Female" ...
##  $ Customer.Type                    : chr  "Loyal Customer" "disloyal Customer" "Loyal Customer" "Loyal Customer" ...
##  $ Age                              : int  13 25 26 25 61 26 47 52 41 20 ...
##  $ Type.of.Travel                   : chr  "Personal Travel" "Business travel" "Business travel" "Business travel" ...
##  $ Class                            : chr  "Eco Plus" "Business" "Business" "Business" ...
##  $ Flight.Distance                  : int  460 235 1142 562 214 1180 1276 2035 853 1061 ...
##  $ Inflight.wifi.service            : int  3 3 2 2 3 3 2 4 1 3 ...
##  $ Departure.Arrival.time.convenient: int  4 2 2 5 3 4 4 3 2 3 ...
##  $ Ease.of.Online.booking           : int  3 3 2 5 3 2 2 4 2 3 ...
##  $ Gate.location                    : int  1 3 2 5 3 1 3 4 2 4 ...
##  $ Food.and.drink                   : int  5 1 5 2 4 1 2 5 4 2 ...
##  $ Online.boarding                  : int  3 3 5 2 5 2 2 5 3 3 ...
##  $ Seat.comfort                     : int  5 1 5 2 5 1 2 5 3 3 ...
##  $ Inflight.entertainment           : int  5 1 5 2 3 1 2 5 1 2 ...
##  $ On.board.service                 : int  4 1 4 2 3 3 3 5 1 2 ...
##  $ Leg.room.service                 : int  3 5 3 5 4 4 3 5 2 3 ...
##  $ Baggage.handling                 : int  4 3 4 3 4 4 4 5 1 4 ...
##  $ Checkin.service                  : int  4 1 4 1 3 4 3 4 4 4 ...
##  $ Inflight.service                 : int  5 4 4 4 3 4 5 5 1 3 ...
##  $ Cleanliness                      : int  5 1 5 2 3 1 2 4 2 2 ...
##  $ Departure.Delay.in.Minutes       : int  25 1 0 11 0 0 9 4 0 0 ...
##  $ Arrival.Delay.in.Minutes         : num  18 6 0 9 0 0 23 0 0 0 ...
##  $ satisfaction                     : chr  "neutral or dissatisfied" "neutral or dissatisfied" "satisfied" "neutral or dissatisfied" ...
# On retire les colonnes inutiles.
DF <- DF[,c(-1,-2)]
# On modifie le nom des lignes pour le style ;-)
row.names(DF) <- paste("n°", sep="", 1:dim(DF)[1]) 
# On renomme les colonnes pour avoir des noms moins longs (Utile pour l'affichage).
colnames(DF) <- c("Genre", "Fidélité", "Age", "Type.du.vol", "Classe", "Distance", "Wifi", "Horaire.pratique", "Facilité.resevation", "Emplacement.porte", "Nourriture", "Enregistrement.en.ligne", "Siege.confort", "Loisir", "On.board.service", "Espace.jambe", "Gestion.bagage", "Checkin.service", "Inflight.service", "Propreté", "Retard.depart", "Retard.arrivé", "Satisfaction")

Petit avant gout des données :

ON s’intéresse aux notes attribuées par les passagers. Ci-dessous on voit que les notes sont assez homogènes, elles ont toutes :

##       Wifi      Horaire.pratique Facilité.resevation Emplacement.porte
##  Min.   :0.00   Min.   :0.00     Min.   :0.000       Min.   :0.000    
##  1st Qu.:2.00   1st Qu.:2.00     1st Qu.:2.000       1st Qu.:2.000    
##  Median :3.00   Median :3.00     Median :3.000       Median :3.000    
##  Mean   :2.73   Mean   :3.06     Mean   :2.757       Mean   :2.977    
##  3rd Qu.:4.00   3rd Qu.:4.00     3rd Qu.:4.000       3rd Qu.:4.000    
##  Max.   :5.00   Max.   :5.00     Max.   :5.000       Max.   :5.000    
##    Nourriture    Enregistrement.en.ligne Siege.confort      Loisir     
##  Min.   :0.000   Min.   :0.00            Min.   :0.00   Min.   :0.000  
##  1st Qu.:2.000   1st Qu.:2.00            1st Qu.:2.00   1st Qu.:2.000  
##  Median :3.000   Median :3.00            Median :4.00   Median :4.000  
##  Mean   :3.202   Mean   :3.25            Mean   :3.44   Mean   :3.358  
##  3rd Qu.:4.000   3rd Qu.:4.00            3rd Qu.:5.00   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.00            Max.   :5.00   Max.   :5.000  
##  On.board.service  Espace.jambe   Gestion.bagage  Checkin.service
##  Min.   :0.000    Min.   :0.000   Min.   :1.000   Min.   :0.000  
##  1st Qu.:2.000    1st Qu.:2.000   1st Qu.:3.000   1st Qu.:3.000  
##  Median :4.000    Median :4.000   Median :4.000   Median :3.000  
##  Mean   :3.383    Mean   :3.351   Mean   :3.632   Mean   :3.304  
##  3rd Qu.:4.000    3rd Qu.:4.000   3rd Qu.:5.000   3rd Qu.:4.000  
##  Max.   :5.000    Max.   :5.000   Max.   :5.000   Max.   :5.000  
##  Inflight.service    Propreté    
##  Min.   :0.000    Min.   :0.000  
##  1st Qu.:3.000    1st Qu.:2.000  
##  Median :4.000    Median :3.000  
##  Mean   :3.641    Mean   :3.286  
##  3rd Qu.:5.000    3rd Qu.:4.000  
##  Max.   :5.000    Max.   :5.000

On peut aussi observer les autres variables quantitatives :

Analyse des données

On commence notre analyse par une ACP sur les variables quantitatives.

ACP

On récupère toutes les données quantitatives et la satisfaction.

# On récupère Âge/Distance du vol/Retard Depart/Retard Arrivé (colonne 3/6/21/22), les notes (colonnes 7 à 20) et la satisfaction (colonne 23)
DF.tmp <- DF[,c(3,6,21,22,7:20,23)]
res.pca <- PCA(DF.tmp, quanti.sup=1:4, quali.sup=19, graph=FALSE)

Il est évident de penser que plus les notes attribuées par les voyageurs sont hautes et plus l’individu a de chance d’être satisfait, on peut le voir avec le graphe ci-dessous. Pour ne pas attribuer trop d’importance aux moyennes des notes des individus qui constituent un petit groupe, on associe une largeur par bande proportionnelle à la taille du groupe pour chaque moyenne attribuée.

Ainsi, on va faire notre ACP sur les notes.


Les individus ou variables peuvent être proches dans le plan mais eloignés dans l’espace s’ils sont mal représentés dans le plan.

Ainsi, il est important d’expliquer le modèle avec des variables bien representées dans le plan. Pour cela on veillera à ne pas prendre les variables et individus ayant un cos2 trop bas. Ici on choisit un cos2 égale à 0.68 afin qu’il ne soit pas trop bas et qu’on ait au moins 3 variables à utiliser afin d’expliquer nos individus sur les axes 1 et 2.

Ici l’axe 1 va opposer le confort à bord (droite) et l’inconfort (gauche), tandis que l’axe 2 fera le contraste sur les aspects techniques pour ce qui concerne le vol.

On peut voir que les variables quantitatives supplémentaires ne sont pas du tout interprétables (flèches en bleu) .

plot(res.pca,select="cos2 0.68", choix="varcor")

Lorsque l’angle entre deux axes est proche de 0°, les variables sont fortement corrélés positivement.

Lorsque l’angle est proche de 90°, les variables ne sont pas corrélés, ou très peu.

Lorsque l’angle est proche de 180°, les variables sont fortement corrélés négativement.

  • Ainsi, ci-dessus on voit que la facilité de reservation et le wifi sont fortement correlés.

  • Loisir et Facilité.reservation ne le sont pas, ou très peu.

  • Loisir et Wifi sont un peu corrélés positivement.

Verifions le :

Graphiquement (Facilité.resevation/Wifi) :

On remarque sur le boxplot qu’il semble y avoir une corrélation entre les notes attribuées à Wifi et à la Faclité de réservation, nous allons maintenant le vérifier.

Test du chi-deux (Facilité.resevation/Wifi) :

On rejette \(H_0\) car p-value<0.5 , ainsi on peut affirmer avec un risque de se tromper de 5% que ces deux variables sont corrélés.

chisq.test(DF.tmp$Facilité.resevation, DF.tmp$Wifi, simulate.p.value=TRUE)
## 
##  Pearson's Chi-squared test with simulated p-value (based on 2000
##  replicates)
## 
## data:  DF.tmp$Facilité.resevation and DF.tmp$Wifi
## X-squared = 240142, df = NA, p-value = 0.0004998

Graphiquement on a pu voir qu’un passager donne, en moyenne, des notes égales à Facilité de reservation et Wifi.


Graphiquement (Loisir/Wifi) :

La corrélation entre Wifi et Loisir semble bien moins flagrante que celle vu précédemment, nous allons le verifier.

Test du Chi-deux (Loisir/Wifi) :

On rejette \(H_0\) car p-value<0.5 , ainsi on peut affirmer avec un risque de se tromper égal à 5% que ces deux variables sont corrélés.

chisq.test(DF.tmp$Loisir, DF.tmp$Wifi, simulate.p.value=TRUE)
## 
##  Pearson's Chi-squared test with simulated p-value (based on 2000
##  replicates)
## 
## data:  DF.tmp$Loisir and DF.tmp$Wifi
## X-squared = 16454, df = NA, p-value = 0.0004998

Graphiquement on a pu voir qu’un passager donne, en moyenne, des notes plus élevées au loisir quand il note bien le Wifi.


Graphiquement (Loisir/Facilité.reservation) :

On vérifie une nouvelle fois la corrélation entre les deux variables.

Test du Chi-deux (Loisir/Facilité.resevartion) :

On rejette \(H_0\) car p-value<0.5 , ainsi on peut affirmer avec un risque de se tromper égal à 5% que ces deux variables sont corrélés.

chisq.test(DF.tmp$Loisir, DF.tmp$Facilité.resevation , simulate.p.value=TRUE)
## 
##  Pearson's Chi-squared test with simulated p-value (based on 2000
##  replicates)
## 
## data:  DF.tmp$Loisir and DF.tmp$Facilité.resevation
## X-squared = 568.5, df = NA, p-value = 0.0004998

Le test du chi-deux montre que Loisir et Facilité.reservation sont corrélés, mais on peut voir graphiquement qu’elles ne le sont pas vraiment, on peut faire l’hypothèse que c’est parce qu’un passager qui met de bonnes notes en moyenne aura tendance à mettre de meilleures notes aux autres catégories, on peut faire le même raisonnement pour les mauvaises notes.


Ci-dessous on peut voir une nette séparation entre les individus satisfaits et non satisfaits. Les individus satisfaits sont ceux s’étant amusé. À l’inverse les individus non satisfaits ont octroyé des notes plus basses concernant les loisirs. On ne peut pas vraiment dire pour l’instant si la facilité de réservation et le wifi à bord influent sur la satisfaction du passager.

Ici par exemple l’individu n°70657 est satisfait, or il a mal noté les loisirs, le wifi et la facilité de réservation. Sa satisfaction est probablement influencée par d’autres variables, qui sont qualitatives. On se penchera sur ce sujet lors de l’ACM.

plot(res.pca,habillage=19, select="cos2 0.93", choix="ind",cex = 0.8)

L’individu qui contribue le plus à l’axe 1 y contribue à environ 0.01%.

max(res.pca$ind$contrib[,1])
## [1] 0.009641166

Il n’y a pas d’individus atypiques, ce qui est normal car nos données sont des notes comprises entre 0 et 5 et on a vu qu’elles étaient homogènes.


Observons maintenant quelle part des données expliquent les composantes.

Premièrement, on peut voir que les 3 premiers axes expliquent bien l’inertie sur les données : Les axes étant orthogonaux, ils expliquent 27.14% + 16.87% + 15.47% = 59.48% de l’inertie.

Quant aux axes 1 et 2, ils prennent en compte 27.14% + 16.87% = 44.01% du jeu de données.

On peut aussi voir que l’axe 2 et 3 expliquent à peu près autant l’un que l’autre l’inertie, ainsi on pourra aussi visualiser les données projetées sur le plan formé par l’axe 1 et 3 (voir 2 et 3).

On a un nouveau cercle de corrélation, ici on voit que :

  • Le confort des sièges, la nourriture et la propreté sont fortement corrélés.

  • La gestion des bagages et les services proposés sont fortement corrélés.

  • Dans ce plan les loisirs sont presque totalement expliqués par l’axe 1.

  • L’axe 3 oppose le “confort” aux services qui sont faiblement corrélés dû à l’angle proche de 90 degrés

plot(res.pca, select="cos2 0.60", choix="varcor", axes = c(1,3))

Ci-dessous on voit donc que les passagers sont en général plus satisfait quand ils se sont amusé (loisirs), que le service était agréable (Gestion bagage, Inflight.service, On.board.service) et qu’ils ont passé un vol confortable (Siege.confort, nourriture, propreté), et inversement pour les passagers non satisfaits.

plot(res.pca, habillage=19, select="cos2 0.9", cex=0.8, choix="ind", axes = c(1,3))

Ici on a le cercle de corrélation avec l’axe 2 et 3:

plot(res.pca, select="cos2 0.6", choix="varcor", axes = c(2,3))

Il n’y a pas grand-chose à interpréter, car le barycentre des voyageurs satisfaits et non satisfaits sont tous les 2 proches du centre de gravité de ce plan.

plot(res.pca, invisible="ind", choix="ind", axes=c(2,3))

Transformations & double centrage

Certains passagers ont attribué comme notes 0 pour certaines catégories du vol, on décide de ne pas faire de transformation par l’inverse, car \(\frac{1}{0}\) est un quotient indéterminé, ni de log-transformation car \(\log(0)\) est indéterminé.

Transformation par racines carrée

On effectue la transformation ”double centrage” sur les données transformées par racine carrée afin de voir si on peut faire gagner en contribution les premières composantes afin d’être plus précis lors de nos analyses.

# On récupère le notes dans le dataframe.
DF.tmp <- sqrt(DF[,7:20])
# On centre et on réduit par rapport aux colones.
DF.tmp <- scale(DF.tmp)
# ACP sur les données transformées.
res.pca <- PCA(DF.tmp, graph=FALSE)
barplot(res.pca$eig[,2], col=rainbow(n=14,alpha=0.6,start=0.66,end=1),
        main="Pourcentage d'intertie expliquée par chaque axe\n(Données transformées par racine carrée)",
        ylab="Contribution en %")
lines(seq(0.75,16.3,(16.3-0.75)/13), res.pca$eig[,2], type="b")
text(seq(0.75,16.3,(16.3-0.75)/13), res.pca$eig[,2]-1, paste(round(res.pca$eig[,2],2),"%"), cex=0.7)

Les transformations ne nous ont pas fait gagner plus d’informations au niveau des 3 premiers axes, on s’arrête là pour l’ACP.

Conclusion ACP

Ici, on a pu étudier l’impact des variables quantitatives sur la satisfaction des gens pour un trajet en avion. Il en est ressorti que les services proposés dans l’avion et le confort à bord sont des aspects primordiaux pour la satisfaction des voyageurs, mais que ce n’étaient pas les seuls arguments à prendre en compte.

ACM

Intéressons-nous maintenant aux donnes qualitatives avec une analyse de composante multiples.

On effectue notre ACM :

res.mca <- MCA(DF.tmp, quali.sup = 5, graph=FALSE)

On peut observer que la première dimension influe à un peu plus de 30%, quant aux dimensions 2, 3, 4, elles influent toutes autour de 20%. Il sera donc sûrement nécessaire de s’intéresser à ces 4 dimensions.

par(mfrow = c(2,2))
for(i in 1:4){
  barplot(res.mca$var$cos2[,i], las = 2, cex.names = 0.64, 
          col=rainbow(n=9,alpha=0.6,start=(i-1)/4,end=i/4),
          main=paste("Cos2 des modalités pour l'axe",i))
}

En se référant aux cos2 (cos2 > 0.7) des barplots précédents :

L’axe 1 oppose les passagers qui voyagent pour le business et les passagers qui voyagent pour un motif personnel. Ceux qui voyagent pour le travail sont en général plus satisfaits et ceux qui voyagent pour un motif personnel sont en général sans avis ou insatisfaits.

L’axe 2 oppose les passagers loyaux aux non-loyaux, il en résulte que les passagers non-loyaux sont plus souvent insatisfaits et que les passagers loyaux.

Les 2 axes prennent aussi en compte à eux deux les voyageurs qui voyagent en business et en éco.

On peut voir que les voyageurs en éco sont moins souvent satisfaits de leur voyage que ceux qui sont en business classe.

plot(res.mca, invisible="ind", axes=c(1,2))

En se référant aux cos2 (cos2 > 0.7) pour l’axe 3 des barplots précédents :

On peut voir que l’axe 3 oppose les personnes de sexe diffèrent, on ne peut pas dire grand-chose quant à l’influence sur la satisfaction du client, on pourrait peut-être dire que les femmes sont un peu moins satisfaites, mais c’est à vérifier.

Vérifions le :

chisq.test(table(DF$Genre, DF$Satisfaction))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(DF$Genre, DF$Satisfaction)
## X-squared = 15.766, df = 1, p-value = 7.168e-05
plot(res.mca, invisible="ind", axes=c(1,3))

Pour prendre en compte les voyageurs en classe éco plus on visualise sur le plan formé par l’axe 3 et 4.

On peut voir ici que les voyageurs en classe éco plus sont moins satisfaits de leur voyages, ils sont très excentrés car ils représentent des données inhabituelles.

plot(res.mca, invisible="ind", axes=c(3,4))

Rappelez-vous de l’individu n°70657, il était satisfait de son vol malgré les mauvaises notes attribuées aux différentes catégories. On voit qu’il possède toutes les modalités influant positivement sur la satisfaction. Ceci montre bien que l’analyse des données qualitatives est importante, car on a eu des informations qu’on ne pouvait pas avoir avec l’ACP.

Conclusion ACM

D’après l’ACM :

  • Si un passager voyage pour des raisons personnelles, il a moins de chance d’être satisfait du vol qu’un passager qui voyage pour le business.

  • Si le passager est un client fidèle (Loyal custommer) il a plus de chance d’être satisfait du vol qu’un passager qui est déloyal (Disloyal custommer).

  • Si un voyageur est en classe business, cela influera positivement sur sa satisfaction, alors que s’il est en classe Eco cela influera négativement. Les passagers Éco plus sont particuliers, mais le fait d’être en classe Éco plus influe négativement sur leur satisfaction.

  • Le sexe de l’individu n’a pas l’air d’influer significativement sur la satisfaction, mais on peut faire l’hypothèse que les femmes sont moins satisfaites que les hommes.

Clustering

Nous allons maintenant appliquer les méthodes de clustering vues en cours. Le regroupement “d’individus” ne sera pas très intéressant à réaliser, nous allons plutôt définir des profils avec l’ensembles des modalités. Ces profils pourront être regroupés en clusters.

Dans cette partie, on considère l’âge comme une variable qualitative à quatres modalités :

  • 7-19 ans
  • 20-38 ans
  • 39-60 ans
  • 61+ ans

Avant la transformation, on vérifie si l’âge a un impact sur la satisfaction des passagers.

On a un nouveau dataframe pour les catégories d’âge comme variable qualitative, il nous permettra de créer les différents profils :

Nous allons maintenant regrouper les individus par groupes en utilisant les différentes méthodes de clustering. On pourra de cette manière déterminer quels sont les profils les plus proches en terme de notation, et de satisfaction.

On ne garde que les profils qui comptent plus de 30 personnes afin d’avoir des résultats intéressants a analyser.

On compte maintenant 38 profils dont on donne la liste ci-dessous.

On fait la moyenne des notes de chaque profil :

CAH

On commence par faire un clustering hiérarchique pour déterminer le nombre de groupes (\(K\)) idéal.

\(K=6\) est un bon compromis.

K=6
# On applique la méthode euclidienne pour avoir les meilleures distances en 2D
DF.agg.dist = dist(DF.agg, method="euclidean")
cah.ward = hclust(DF.agg.dist, method="ward.D2")
# On ajuste la taille des caractères pour un meilleur affichage 
par(cex.main=3, cex=0.4)
plot(cah.ward, hang=-1)
rect.hclust(cah.ward,K)

On a donc réussi à créer 6 groupes de profils similaires sur les 38 profils qu’on est en train d’étudier.

Penchons nous sur la composition de ces groupes :

Dans le tableau ci-dessus on peut voir que :

  • Le groupe 1 rassemble des individus en business classe.

  • Le groupe 2 réunit les individus en business classe voyageant pour le business.

  • Le groupe 3 regroupe les clients fidèles.

  • Le groupe 4 est particulier et rassemble seulement deux profils, en particulier, des profils déloyaux qui voyagent en classe éco.

  • Le groupe 5 réunit des passagers majoritairement en dessous de 39 ans voyageant en classe éco ou éco plus.

  • Le groupe 6 regroupe les passagers de 39 ans et plus, voyageant en éco ou éco plus.


Il n’est pas nécessaire de décrire toutes les moyennes des notes par cluster.

On va s’intéresser à la fréquence des individus satisfaits par cluster.

On voit que les fréquences diffèrent selon les groupes, ainsi, certains groupes sont en moyenne plus satisfait que d’autres.

Par exemple, le cluster n°3 possèdela fréquence de satisfaction la plus élevé avec près de 73%, ainsi un individu ayant un profil associé à ce cluster aura tendance à être satisfait. À l’inverse, un passager dont le profil appartient au cluster n°4, où la fréquence de satisfaction est de 7%, aura tendance à être neutre ou insatisfait.

On a donc réussi à trouver des groupes de profils qui diffèrent par la fréquence de satisfaction des individus qui le constituent.

paged_table(data.frame(Means_groupes.cah))

Le clustering hiérarchique nous permet de déterminer le nombre de groupes qui semble idéal : \(K = 6\). Les notes attribuées selon les différents groupes ne sont pas significativement différentes.

Kmeans

On peut vérifié si le \(K=6\) mis en évidence par le clustering cah était un bon compromis.

En effet, on voit que le pourcentage d’inertie intra-classe arrête d’augmenter de façon accrue à partir d’environ \(K=6\), on aurait pu prendre \(K\) un peu plus grand, mais pourquoi s’embêter avec un nombre de clusters trop élevé quand l’objectif est de regrouper au maximum sans perdre trop d’inertie.

inertie.intra <-rep(0,times=37)
for(k in 1:37){
  kmeans.result <-kmeans(DF.agg,centers=k,nstart=100)
  inertie.intra[k] <- kmeans.result$tot.withinss/kmeans.result$totss
}

plot(1:37,inertie.intra,type="b",xlab="K",ylab="Inertie intra-classe",
     main="Pourcentage d'inertie-classe selon le nombre de classe")
abline(v=6, col="red")

On réalise ensuite le Kmeans, avec le meme nombre de groupes qu’avec le CAH.

res.kmeans = kmeans(DF.agg, centers=Means_groupes.cah[,-15])
groupes.kmeans = res.kmeans$cluster

Means_groupes.kmeans <- matrix(NA, nrow=K, ncol=dim(DF.notes)[2])
colnames(Means_groupes.kmeans)=c(colnames(DF.notes[,-1]),"satisfied")
rownames(Means_groupes.kmeans)= paste("Groupe",1:K,sep="_")
DF.tmp = data.frame(DF.notes,(DF[bool_profil,23]=="satisfied")*1)
for (i in 1:K) Means_groupes.kmeans[i,] <- colMeans(DF.tmp[DF.tmp$profil %in% rownames(data.frame(groupes.kmeans[groupes.kmeans==i])),][,-1])

On voit que l’algorithme du k-means a convergé vers les mêmes groupes que celui du clustering cah.

##            groupes.kmeans
## groupes.cah  1  2  3  4  5  6
##           1  4  0  0  0  0  0
##           2  0  0  0  7  0  0
##           3  0  0  0  0  8  0
##           4  0  0  2  0  0  0
##           5  0 10  0  0  0  0
##           6  0  0  0  0  0  7

Vérifions :

Visualisation

On représente les clusters en 2D à l’aide des composantes principales. On remarque que certains clusters se chevauchent, cette représentation montre l’emplacement de chacun des profils et du groupe auquel il appartient.

fviz_cluster(res.kmeans, data = DF.agg,
             palette = rainbow(K), 
             geom = "point",
             ellipse.type = "convex", 
             ggtheme = theme_bw(),
             main = "Kmeans : Représentation des clusters")